/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable no-unused-vars */
/* eslint-disable @typescript-eslint/no-unused-vars */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
/* eslint-disable @typescript-eslint/explicit-function-return-type */
import { PropType } from 'vue';
import { IGlobalConfig, IScheduleResource } from '../../interface';
import Variables from '../../constant/vars';

// 调度表格属性
export const ScheduleTableProps = {
  /**
   * 资源列表属性
   * @description 定义调度器中的资源列表，用于展示可分配任务的实体（如人员、设备等）
   * @type {IScheduleResource[]} 资源对象数组
   * @default [] 默认为空数组
   */
  resources: {
    type: Array as PropType<IScheduleResource[]>,
    default: () => [],
  },

  /**
   * 任务列表属性
   * @description 定义调度器中的任务列表，包含需要被安排到资源上的各项任务
   * @type {IScheduleTask[]} 任务对象数组
   * @default [] 默认为空数组
   */
  tasks: {
    type: Array as PropType<IScheduleTask[]>,
    default: () => [],
  },

  /**
   * 调度起始时间属性
   * @description 设置调度视图的时间范围开始点
   * @type {Date} 起始日期时间对象
   * @default Variables.default.startTime 默认值来自全局变量配置
   */
  startTime: {
    type: Object as PropType<Date>,
    default: Variables.default.startTime,
  },

  /**
   * 调度结束时间属性
   * @description 设置调度视图的时间范围结束点
   * @type {Date} 结束日期时间对象
   * @default Variables.default.endTime 默认值来自全局变量配置
   */
  endTime: {
    type: Object as PropType<Date>,
    default: Variables.default.endTime,
  },

  /**
   * 头部行高度属性
   * @description 控制调度器头部区域每行的高度
   * @type {Number} 高度数值（单位通常为像素）
   * @default Variables.default.headerRowHeight 默认值来自全局变量配置
   */
  headerRowHeight: {
    type: Number,
    default: Variables.default.headerRowHeight,
  },

  /**
   * 头部背景颜色属性
   * @description 设置调度器头部区域的背景色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.headerBgColor 默认值来自全局变量配置
   */
  headerBgColor: {
    type: String,
    default: Variables.default.headerBgColor,
  },

  /**
   * 头部文字颜色属性
   * @description 设置调度器头部区域的文字颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.headerTextColor 默认值来自全局变量配置
   */
  headerTextColor: {
    type: String,
    default: Variables.default.headerTextColor,
  },

  /**
   * 资源列宽度属性
   * @description 控制资源列表所在列的显示宽度
   * @type {Number} 宽度数值（单位通常为像素）
   * @default Variables.default.resourceColumnWidth 默认值来自全局变量配置
   */
  resourceColumnWidth: {
    type: Number,
    default: Variables.default.resourceColumnWidth,
  },

  /**
   * 资源主体行高属性
   * @description 设置资源主体部分每一行的高度
   * @type {Number} 行高度数值（单位通常为像素）
   * @default Variables.default.resourceBodyRowHeight 默认值来自全局变量配置
   */
  resourceBodyRowHeight: {
    type: Number,
    default: Variables.default.resourceBodyRowHeight,
  },

  /**
   * 资源主体背景色属性
   * @description 设置资源主体区域的背景颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.resourceBodyBg 默认值来自全局变量配置
   */
  resourceBodyBg: {
    type: String,
    default: Variables.default.resourceBodyBg,
  },

  /**
   * 资源驱动线颜色属性
   * @description 设置连接资源与任务之间的驱动线颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.resourceDriverColor 默认值来自全局变量配置
   */
  resourceDriverColor: {
    type: String,
    default: Variables.default.resourceDriverColor,
  },

  /**
   * 时间刻度列宽属性
   * @description 控制时间刻度列的显示宽度
   * @type {Number} 列宽度数值（单位通常为像素）
   * @default Variables.default.scaleColumnWidth 默认值来自全局变量配置
   */
  scaleColumnWidth: {
    type: Number,
    default: Variables.default.scaleColumnWidth,
  },

  /**
   * 时间刻度范围属性
   * @description 定义时间轴上可见的时间段范围
   * @type {number[]} 数字数组表示时间段范围
   * @default Variables.default.scaleRange 默认值来自全局变量配置
   */
  scaleRange: {
    type: Array as PropType<number[]>,
    default: Variables.default.scaleRange,
  },

  /**
   * 时间刻度值属性
   * @description 设置时间刻度的基本单位值
   * @type {Number} 时间间隔数值
   * @default Variables.default.scaleValue 默认值来自全局变量配置
   */
  scaleValue: {
    type: Number,
    default: Variables.default.scaleValue,
  },

  /**
   * 时间刻度背景色属性
   * @description 设置时间刻度区域的背景颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.scaleBodyBg 默认值来自全局变量配置
   */
  scaleBodyBg: {
    type: String,
    default: Variables.default.scaleBodyBg,
  },

  /**
   * 时间刻度文字颜色属性
   * @description 设置时间刻度区域的文字颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.scaleTextColor 默认值来自全局变量配置
   */
  scaleTextColor: {
    type: String,
    default: Variables.default.scaleTextColor,
  },

  /**
   * 网格线颜色属性
   * @description 设置调度器网格线的颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.gridLineColor 默认值来自全局变量配置
   */
  gridLineColor: {
    type: String,
    default: Variables.default.gridLineColor,
  },

  /**
   * 是否允许拖拽属性
   * @description 控制是否启用任务元素的拖拽功能
   * @type {Boolean} 布尔值开关
   * @default Variables.default.allowDrag 默认值来自全局变量配置
   */
  allowDrag: {
    type: Boolean,
    default: Variables.default.allowDrag,
  },

  /**
   * 拖拽步进间隔属性
   * @description 设置拖拽操作时移动的最小时间间隔
   * @type {Number} 步进时间数值（单位通常为分钟或小时）
   * @default Variables.default.dragInterval 默认值来自全局变量配置
   */
  dragInterval: {
    type: Number,
    default: Variables.default.dragInterval,
  },

  /**
   * 拖拽前处理函数属性
   * @description 在任务元素开始拖拽时执行，用于处理拖拽前的逻辑
   * @type {Function} 处理函数
   * @default () => true 默认返回true，表示允许拖拽操作
   */
  beforeDrag: {
    type: Function as PropType<
      (
        dragData: Record<string, any>,
        resource: IScheduleResource,
        timeRange: { startTime: Date; endTime: Date },
      ) => Promise<boolean>
    >,
    default: () => true,
  },

  /**
   * 拖拽资源前处理函数属性
   * @description 在任务元素开始拖拽时执行，用于处理拖拽前的逻辑
   * @type {Function} 处理函数
   * @default () => true 默认返回true，表示允许拖拽操作
   */
  beforeResourceDrop: {
    type: Function as PropType<
      (dragData: Record<string, any>) => Promise<boolean>
    >,
    default: () => true,
  },

  /**
   * 拖拽任务前处理函数属性
   * @description 在任务元素开始拖拽时执行，用于处理拖拽前的逻辑
   * @type {Function} 处理函数
   * @default () => true 默认返回true，表示允许拖拽操作
   */
  beforeTaskDrop: {
    type: Function as PropType<
      (
        dragData: Record<string, any>,
        resource: IScheduleResource,
        timeRange: { startTime: Date; endTime: Date },
      ) => Promise<boolean>
    >,
    default: () => true,
  },

  /**
   * 拖拽完成处理函数属性
   * @description 在任务元素完成拖拽时执行，用于处理拖拽完成后的逻辑
   * @type {Function} 处理函数
   * @default () => true 默认返回true，表示允许拖拽操作
   */
  dropCompleted: {
    type: Function as PropType<
      (
        dragData: Record<string, any>,
        resource: IScheduleResource,
        timeRange: { startTime: Date; endTime: Date },
      ) => Promise<boolean>
    >,
    default: () => true,
  },
};

// 调度表格事件
export const ScheduleTableEvent = {
  /**
   * 保存当前调度配置、资源和任务数据
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param resources 调度资源数组，包含所有可用的资源信息
   * @param tasks 调度任务数组，包含所有需要执行的任务信息
   * @returns 始终返回true，表示保存操作已执行
   */
  save: (
    config: IGlobalConfig,
    resources: IScheduleResource[],
    tasks: IScheduleTask[],
  ) => true,

  /**
   * 另存为当前调度配置、资源和任务数据
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param resources 调度资源数组，包含所有可用的资源信息
   * @param tasks 调度任务数组，包含所有需要执行的任务信息
   * @returns 始终返回true，表示另存为操作已执行
   */
  saveAs: (
    config: IGlobalConfig,
    resources: IScheduleResource[],
    tasks: IScheduleTask[],
  ) => true,

  /**
   * 处理上下文菜单事件
   * @param type 触发上下文菜单的元素类型，可为资源、任务或空白区域
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param data 触发上下文菜单的具体数据对象，根据type不同可能是资源或任务数据
   * @returns 始终返回true，表示上下文菜单处理已完成
   */
  contextMenu: (
    type: 'resource' | 'task' | 'blank',
    config: IGlobalConfig,
    data: IScheduleResource | IScheduleTask,
    event: MouseEvent,
  ) => true,

  /**
   * 处理资源点击事件
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param resource 触发点击事件资源的数据对象
   * @returns 始终返回true，表示资源点击处理已完成
   */
  resourceClick: (
    config: IGlobalConfig,
    resource: IScheduleResource,
    event: MouseEvent,
  ) => true,

  /**
   * 处理任务点击事件
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param task 触发点击事件的任务数据对象
   * @returns 始终返回true，表示任务点击处理已完成
   */
  taskClick: (config: IGlobalConfig, task: IScheduleTask, event: MouseEvent) =>
    true,

  /**
   * 处理任务改变事件
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param oldTask 改变前的任务数据对象
   * @param newTask 改变后的任务数据对象
   * @returns 始终返回true，表示任务改变处理已完成
   */
  taskChange: (
    config: IGlobalConfig,
    oldTask: IScheduleTask,
    newTask: IScheduleTask,
    event: MouseEvent,
  ) => true,
};
